; 561 1105 1729 2465 2821 6601

(define (expmod base exp m)
    (cond   ((= exp 0) 1)
            ((even? exp)
                (remainder  (square (expmod base (/ exp 2) m))
                            m))
            (else
                (remainder  (* base (expmod base (- exp 1) m))
                            m))))

; (define (fermat-test n)
;     (define (fermat-test-iter n start)
;         (cond   ((= start n)
;                     (newline)
;                     (display n)
;                     (display ": Passed"))
;                 ((= (expmod start n n) start)
;                     (fermat-test-iter n (+ start 1))
;                     (display " ")
;                     (display start))
;                 (else
;                     (newline)
;                     (display ": Failed"))))
;     (fermat-test-iter n 2))

(define (fermat-test n)
    (display n)
    (display ": ")
    (define (fermat-test-iter n start)
        (cond   ((= start n) true)
                ((= (expmod start n n) start)
                    (fermat-test-iter n (+ start 1)))
                (else false)))
    (fermat-test-iter n 2))

(display "\n========================================\n")
(display (fermat-test 561))
(newline)
(display (fermat-test 1105))
(newline)
(display (fermat-test 1729))
(newline)
(display (fermat-test 2465))
(newline)
(display (fermat-test 2821))
(newline)
(display (fermat-test 6601))
(newline)
(display (fermat-test 6602))
(display "\n========================================\n")